თავი 5. მონაცემების ამორჩევა ერთზე მეტი ცხრილიდან - ცხრილების გაერთიანება

         ე.ფ. კოდდის რეალაციური მოდელის საფუძველს სიმრავლეთა თეორია და პირველი რიგის პრედიკატების გამოანგარიშება წარმოადგენს. SQL ენაში რეალიზებულია სიმრავლეებზე ოპერაციები  _ სიმრავლეების: გადაკვეთა, სხვაობა, გაერთიანება. 
N სიმრავლეთა გადაკვეთის შედეგია სიმრავლე, რომელის ელემენტები ერთდროულად ეკუთვნის N სიმრავლეს. SQL ენაში სიმრავლეთა გადაკვეთა რეალიზებულია ოპერაციით JOIN _ გადაკვეთა გასაღების მნიშვნელობის მიხედვით ხორციელდება. JOIN წარმოადგენს FROM-ის ნაწილს. JOIN განსაზღვრავს ლოგიკურ ცხრილს, რომელიც ორი ცხრილის დაკავშირების შედეგია. JOIN-ის მოთავსება FROM-ში გასაზღვრავს ცხრილების დაკავშირების თანმიმდევრობას.
       SQL-ის სტანდარტით განსაზღვრულია  JOIN ოპერაციის შესრულების ხერხები, რომელთაგან ბუნებრივია ოპერაცია INNER JOIN. მას შინაგან გაერთიანებას უწოდებენ. დაუშვათ ჩვენ ვაკავშირებთ ორ ცხრილს ერთი შეიცავს ინფორმაციას სტუდენტის გვარისა და სახელის შესახებ, ხოლო მეორე,  კი საგნების ჩამონათვალს, რომლებიც არჩეულ იქნენ სტუდენტების მიერ. მოცემულ მომენტში სტუდენტთა გარკვეულ ნაწილს შეიძლება არ ქონდეთ არჩეული საგანი ან მოცემულ საგანი არცერთი სტუდენტის მიერ არ იქნა არჩეული. INNER JOIN-ით ამოირჩევა მხოლოდ ის სტუდენტები, რომლებსაც საგანი არჩეული აქვთ. ვერ მიიღება იმ სტუდენტების სია, რომლებსაც საგანი ამორჩეული არ აქვთ ან საგნების ნუსხა, რომლებიც არცერთ სტუდენტს არ აქვს არჩეული.
ორი სიმრავლის სხვაობა არის სიმრავლე, რომელიც შედგება პირველი ცხრილის იმ ელემენტებისგან, რომლებიც არ ეკუთვნიან მეორე სიმრავლეს. SQL ენაში სიმრავლეთა სხვაობა რეალიზებულია ოპერაციით OUTER JOIN  ან EXEPT
ორი სიმრავლის გაერთიანება არის სიმრავლე, რომელიც შედგება ორივე სიმრავლის ელემენტებისგან იმ განსხვავებით, რომ საშედეგო სიმრავლეში ორივე სიმრავლეში არსებული ერთიდაიგივე ელემენტი ერთხელ არის ჩაწერილი.

5.1. შინაგანი გაერთიანება INNER JOIN

       უმრავლეს შემთხვევაში  JOIN-ით აკავშირებენ ერთი ცხრილის პირველად გასაღებს მეორე ცხრილის გარე გასაღებთან. ორივე გასაღები ერთიდაიგივე მონაცემის ტიპით უნდა იყოს აღწერილი. ამავე დროს  JOIN-ით შესაძლებელია ორი ცხრილის დაკავშირება ერთნაირი ტიპის მონაცემების მქონე ნებისმიერი სვეტებით. ზოგადად ერთი სიმბოლური სტრიქონი, თარიღის ტიპის სვეტი შეიძლება დაკავშირებულ იქნეს მეორე ცხრილის სიმბოლურ სტრიქონთან ან გამოსახულებასთან, ან თარიღის ტიპის სვეტთან.
INNER JOIN-ის შემადგენელი ნაწილია მეორე ცხრილისდასახელების შემდეგ დაწერილი  პირობა ON ან USING, რომელიც სისტემას მიუთითებს დაკავშირების ხერხს. სისტემა ერთი ცხრილის ყოველ სტრიქონს ლოგიკურად აერთიანებს მეორე ცხრილის სტრიქონთან, რომელსაც დეკარტეს ნამრავლს უწოდებენ. ჩანაწერების ამორჩევის მიზნით შემდეგ გამოიყენება ON ან USING პირობაში მითითებული კრიტერიუმი. მაგალითად:
SELECT tbsaqoneli.das, tbsaq_mireba.tariri, tbsaq_mireba.raodenoba
FROM tbsaqoneli INNER JOIN tbsaq_mireba ON tbsaqoneli.nomeri = tbsaq_mireba.saq_nomeri
აქ ნაჩვენებია, რომ ადგილი აქვს შინაგან გაერთიანებას INNER JOIN-ის დასაკავშირებელი ცხრილის სახელია დაწერილი - tbsaqoneli, მის შემდეგ მეორე ცხრილის სახელი - tbsaq_mireba, ხოლო ON პირობის შემდეგ ცხრილების დაკავშირების პირობა, კერძოდ ცხრილი tbsaqoneli ცხრილთან tbsaq_mireba დაკავშირებულია ველით ”საქონლის ნომერი” (ცხრილებში მათ განსხვავებული სახელები აქვთ, მაგრამ შინაარსობრივად იდენტურნი არიან).
პრაქტიკულ ამოცანებში ორი ცხრილის დაკავშირება საკმარისი არ არის, დაკავშირება ხორციელდება სამი, ოთხი და ა.შ. ცხრილების. ამ სემთხვევაში  INNER JOIN რამდენჯერმე გამოიყენება
SELECT tbsawyobi.dasaxeleba, tbsaqoneli.das, tbsaq_mireba.tariri, tbsaq_mireba.raodenoba
FROM tbsawyobi INNER JOIN (tbsaqoneli INNER JOIN tbsaq_mireba ON tbsaqoneli.nomeri = tbsaq_mireba.saq_nomeri) ON tbsawyobi.nomeri = tbsaq_mireba.saw_nomeri
ამ მაგალითში ცხრილი  tbsawyobi დაკავშირებულია ცხრილების tbsaqoneli და tbsaq_mireba გართიანებასთან. დაკავშირების პირობაა tbsawyobi.nomeri = tbsaq_mireba.saw_nomeri.
განვიხილოთ ურთირთდაკავშირებული ცხრილებიდან ამორჩევის მაგალითი. დავაკავშიროთ ერთმანეთან ჩვენს მიერ დაპროექტებული ცხრილები: tbsawyobi, tbsaqoneli, tbsaq_mireba/სურ. 12/

სურ. 12. ჩვენს მიერ დაპროექტებული ცხრილები დაკავშირების რეჟიმში

ზევით მოტანილ ინსტრუქციაში ცხრილებს შორის კავშირი წარმოდგენილია INNER JOIN-ის, რომელსაც შინაგან გაერთიანებას უწოდებენ. ცხრილებს შორის კავშირი გასაღებების დონეზე ნაჩვენების ON-ით. იგი WHERE-ს იდენტურ როლს ასრულებს. შინაგანი გაერთიანებისას საშედეგო ცხრილში გამოიტანება ის ერთმანეთთან დაკავშირებული  ჩანაწერები, რომელთა მნიშვნელობები დამაკავშირებელ ველებში ერთმანეთს ემთხვევა.
ამორჩევის შედეგია:
საწყობის დასახელება        საქონლის დასახელება        თარიღი         რაოდენობა        შეძ. ფასი
კვების პროდუქტები            მაკარონი                21.03.2009        500,00         0,70
კვების პროდუქტები           მაკარონი                20.03.2009        750,00        
კვების პროდუქტები           მაკარონი                22.03.2009         600,00         0,70
კვების პროდუქტები           შაქარი                  21.03.2009         1200,00         0,70
კვების პროდუქტები           შაქარი                  20.03.2009         800,00         0,70
ელექტროტექ. საქონელი   მიქსერი                  21.03.2009         100,00        15,00
ელექტროტექ. საქონელი  მიქსერი                   20.03.2009         30,00           16,00

შინაგანი გაერთიანების - INNER JOIN-ის Access 2007-ში შეიძლება გამოყენებულ იქნეს მარცხენა გარე გაერთიანება (LEFT JOIN) და მარჯვენა გარე გაერთიანება (RIGHT JOIN). როგორც ცნობილია ცხრილებს შორის კავშირის ტიპებია 1:1, 1:M, M:1, M:M. M:M-თან კავშირი ხორციელდება 1:M-თან საშუალებით. შორის მარცხენა გაერთიანებისას მარცხენა ცხრილიდან ამოირჩევა ყველა ჩანაწერი, ისინიც რომლებსაც მარჯვენა ცხრილში შეესაბამება ჩანაწერები. მარცხენა გარე გაერთიანება დაპროექტების რეჟიმში შემდეგნაირად გამოიყურება     /სურ. 13/:

სურ. 13. მარცხენა გარე გაერთიანება

მარცხენა გარე გაერთიანების შესასიტყვი SQL ინსტრუქცია შემდეგია:

SELECT tbsaqoneli.das, tbsaq_mireba.tariri, tbsaq_mireba.raodenoba, tbsaq_mireba.sez_fasi
FROM tbsaqoneli LEFT JOIN tbsaq_mireba ON tbsaqoneli.nomeri = tbsaq_mireba.saq_nomeri

ამორჩევის შედეგი შემდეგია:
საქონლის დასახელება          თარიღი          რაოდენობა        შეძ. ფასი
მაკარონი                     21.03.2009        500,00                       0,70
მაკარონი                     20.03.2009        750,00        
მაკარონი                     22.03.2009        600,00                       0,70
შაქარი                                 21.03.2009        1200,00                0,70
შაქარი                                 20.03.2009        800,00                       0,70
მიქსერი                                 21.03.2009        100,00                      15,00
მიქსერი                                 20.03.2009        30,00                      16,00
წვენების საწური                        

მიაქციეთ ყურადღება ცხრილიდან tbsaqoneli ამორჩეულია საქონლის დასახელება ”წვენების საწური” , რომლის შესასიტყვი ჩანწერები ცხრილში tbsaq_mireba არ არსებობს. 
მარჯვენა გაერთიანებისას (RIGHT JOIN)  მარჯვენა ცხრილიდან ამოირჩევა ყველა ჩანაწერი, მათ შორის ის ჩანაწერებიც, რომლებსაც მარცხენა ცხრილში შეესაბამება ჩანაწერები.
მარჯვენა გარე გაერთიანება დაპროექტების რეჟიმში შემდეგნაირად გამოიყურება/სურ. 14/:  

სურ.14. მარჯვენა გარე გაერთიანება დაპროექტების რეჟიმში

მარჯვენა გარე გაერთიანების შესასიტყვი SQL ინსტრუქცია შემდეგია:
SELECT tbsaq_mireba.tariri, tbsaq_mireba.raodenoba
FROM tbsawyobi RIGHT JOIN tbsaq_mireba ON tbsawyobi.nomeri = tbsaq_mireba.saw_nomeri
ამოვარჩიოთ იმ სტრუდენტების სია, რომლებსაც გაცდენილი აქვთ ლექცია-სემინარები 2007 წლის ივნისის თვეში
SELECT tbsaati.nomeri, tbstudenti.gvari, tbstudenti.saxeli, tbstudenti.kursi, tbstudenti.jgufi, tbsag.sagdas AS[dasaxeleba], tbsaati.tar AS[TariRi], tbsaati.gacdsaati AS [gacdenili saaTi]
FROM tbsag INNER JOIN (tbstudenti RIGHT JOIN tbsaati ON tbstudenti.nomeri = tbsaati.nomeri) ON tbsag.sagkodi = tbsaati.sagkodii
ORDER BY tbsaati.nomeri
 
 
 



ნომერი        
       გვარი
სახელი
კურსი
ჯგუფი
დასახელება
თარიღი
გაც-ლი საათი
12
ლომია
დევი
1
125
ინტერნეტ-ტექნოლოგიები
01.06.2008
       2
12
ლომია
დევი
1
125
დაპროგრამება
01.06.2008
       2
13
ლომიძე
გოგა
1
125
ინტერნეტ-ტექნოლოგიები
01.06.2008
       2
13
ლომიძე
გოგა
1
125
დაპროგრამება
01.06.2008
       2
18
ლალაძე
ნანა
2
128
დაპროგრამება
01.06.2008
       2
18
ლალაძე
ნანა
2
128
ინტერნეტ-ტექნოლოგიები
01.06.2008
       2
საშედეგო მონაცემები დახარისხებული იქნება ზრდადობით. როგორც ზევით აღვნიშნეთ, ბრძანების ORDER BY სინტაქსი შემდეგია:
ORDER BY field1 [ASC ! DESC ] [, field2 [ASC ! DESC ]] [,…..]]]
field1 ველის დასახელებაა, რომლითაც დახარისხება ხდება(ჩვენს მაგალითში ველით ს.დასახელება). ASC გვიჩვენებს, რომ დახარისხება ზრდადობით ხორციელდება, ხოლო DESC გვიჩვენებს, რომ დახარისხება შემცირებით წარმოებს. თუ გამოტოვებულია ეს არგუმენტი, მაშინ გაჩუმებით იგულისხმება, რომ დახარისხება ზრდადობით ხორციელდება.